#include <stdio.h>
#include <stdlib.h>
#include <queue>

#include <opencv/cv.h>
#include <opencv/highgui.h>

#include "CVGaussian.h"

#ifndef CV_STIP
#define CV_STIP


/**
		@class CVStip
		@brief 
		Permet l'extraction de point clés Spatio-Temporels (STIP)
		C'est une extention du détecteur de Harris à la dimention temporelle.		
*/
class CVStip
{
	public:
		CVStip();
		
		/**
		@param dimT : Dimention Temporelle
		@param dimX : Dimention Spaciale en X
		@param dimY : Dimention Spaciale en Y
		@param K : Coefficient de courbure
		@param sigmaS : Sigma du Gaussien Spacial
		@param sigmaT : Sigma du Gaussien Temporel
		@param threshold_enable : Valid le seuillage
		@param threshold : Valeur du seuillage
		@brief Initialise en charger les paramètres de puis un fichier de paramètres STIP
		*/
		void init(int dimT,int dimX,int dimY,float K,
							float sigmaS,float sigmaT,
							bool threshold_enable,float threshold);
		
		/**
		@param frame : Image
		@brief Pousse une image dans le FIFO
		*/
		void push(const cv::Mat & frame);

		/**
		@brief Execution du module
		@return Image si le seuil n'est pas validé ou une liste de keyspoints sinon 
		*/
		cv::Mat & process();

		void setDimT(int dimT);
		void setDimX(int dimX);
		void setDimY(int dimY); 
		void setSigmaT(float sigmaT);
		void setSigmaS(float sigmaS);
		void setK(float K);
		void setThreshold(bool threshold_enable,float threshold);
		void setMask(const cv::Mat& mask); 
		
		int getDimT();
		int getDimX();
		int getDimY(); 
		float getSigmaT();
		float getSigmaS();
		float getK();
		bool isThresholdEnabled();
		float getThreshold();
		void setOutput(int id);

	private:
		bool mask_use;
		cv::Mat mask;
		cv::Mat result;
		cv::Mat frame_nvg32f;
		cv::Mat current_img;
		std::vector<cv::KeyPoint> keys;
		std::deque<cv::Mat> bufferT;

		CVGaussian gaussians;
		float K; 
		bool threshold_enable;
		float threshold;
		int idOutput;
};

#endif
